2.2 Návrh algoritmu, modulárne programovanie
Dobrý algoritmus nevznikne náhodne. Aj k napísaniu najjednoduchšieho programu treba mať jasnú predstavu. Ak máme riešiť úlohu na počítači, hneď nás láka sadnúť si k počítaču a začať ťukať príkazy - ktoré podľa nás - vedú k riešeniu danej úlohy. Po skončení písania zdrojového programu pomerne rýchlo odstránime syntaktické chyby zistené prekladačom. Ale takto narýchlo napísaný program veľmi zriedkavo funguje správne. A začne sa opravovanie. Program pre niektoré údaje pracuje správne, pre iné nie. Keď niečo "opravíme", objaví sa iný problém. Časom sa to tak dopletie, že dokonca ani sami nebudeme vedieť čo bolo našou úlohou. Takto "opravovať" nie je charakteristické pre dobrého programátora. Vytvoriť spoľahlivý program môžeme výlučne iba dôkladným plánovaním!
Prvým krokom pri tvorbe návrhu algoritmu je podrobná analýza a definícia úlohy. Spôsob riešenia môžeme určiť až potom, keď dobre poznáme úlohu. Aby bolo jednoznačné, čo je úlohou, popis úlohy musí byť písomne podchytený. Popis úlohy sa obvykle nazýva špecifikáciou úlohy. Po presnej definícii úlohy pristúpime k tvorbe algoritmu (zatiaľ nezávisle na programovacom jazyku). Na prehľadné zobrazenie algoritmu existuje viacero spôsobov. Takými sú: slovný popis, vývojový diagram, štrykturogram alebo Jacksonov diagram. Tieto neskôr podrobnejšie rozoberieme. Teraz sa pozrieme na tie všeobecné princípy, ktoré sa doporučuje dodržiavať pri tvorbe algoritmu.
Plánovanie údajov
Nakoľko algoritmus pracuje s údajmi, najprv musíme naplánovať údaje resp. údajové štruktúry vyskytujúce sa v úlohe. Až potom môžeme pristúpiť k tvorbe vlastného algoritmu, ktorý pracuje s údajmi. Typy údajov, ich štruktúru a možnosti ich ukladania budeme rozoberať priebežne.
Modulárne programovanie
Základom plánovania algoritmu (programu) je dekompozícia. Nakoľko úlohu naraz nedokážeme vyriešiť, musíme ho rozbiť na menšie časti - moduly. Jednotlivé dielčie úlohy musíme vyriešiť a potom znova spojiť do jedného celku, aby program mohol fungovať. Otázkou zostáva ako máme rozbiť našu úlohu na dielčie úlohy a ako ich vyriešiť - nakoniec ako ich spojiť. Vzniklo už veľmi veľa spôsobov tvorby algoritmu - cieľom každého spôsobu bolo uľahčenie práce programátora - nájsť vhodnú metodiku čo možno najrýchlejšieho vyriešenia problému, teda napísania podľa možnosti najlepšieho, najkrajšieho a najspoľahlivejšieho programu - takého aby ho bolo možné v budúcnosti modifikovať a zdokonaľovať. Všetky doteraz známe metódy sa v jednom podobajú, každá z nich sa snaží dodržiavať princíp rozkladania na moduly. Modulárne programovanie je takou metódou programovania, kde celý program pozostáva z modulov. Jednotlivé moduly sú primerane veľké (spracovateľsky prehľadné), ich cieľ je jednoznačný a spájajú sa vhodným, konkrétnym spôsobom.
Základné zásady modulárneho programovania sú:
- Princíp: "Rozdeľuj a panuj!" Úlohu musíme rozdeliť jednoznačne na moduly. Do práce modulov iný modul nezasahuje, ale očakáva sa, aby každý modul svoju prácu vykonal perfektne a každý modul je zodpovedný za svoju prácu. Je veľmi dôležité aby moduly (nakoľko je to možné) boli navzájom nezávislé, lebo v tomto prípade sa chyby dajú ľahšie odstrániť, úloha je prehľadnejšia a ľahšie sa dá modifikovať. Vytvorené, dokonale fungujúce moduly (časti programov) nakoniec pospájané do jedného celku. Takto budeme mať lepší prehľad o celom programe.
- Princíp schovania údajov (informácií): Príslušné časti programov podľa možnosti majú pracovať iba s vlastnými údajmi. Časti majú používať spoločné údaje iba v nevyhnutných prípadoch. Oveľa ľahšie je zistiť chybu ak daná časť programu zodpovedá za svoje dáta, a do týchto dát iná časť nemôže zasahovať. Ideálne je ak jednotlivé časti programu odovzdávajú navzájom iba už hotové údaje.
- Princíp čo možno neskoršieho rozhodovania: Rozhodovať by sa malo iba vtedy, keď je to nevyhnutné. Tie rozhodovania, pre ktoré ešte nemáme dosť informácií, presuňme na neskoršie - v opačnom prípade sa môže stať, že na neskoršej etape budeme musieť prehodnotiť naše rozhodnutia.
- Princíp vyslovenia rozhodnutí: Počas riešenie úlohy nevypusťme ani jedno rozhodnutie. Ak sme vyslovili nejaké rozhodnutie, potom toto rozhodnutie musíme napísať - v opačnom prípade neskôr môžeme naň zabudnúť a môže sa stať, že vyslovíme opačné rozhodnutia.
V princípe smer rozdelenia úlohy na moduly môže byť dvojaké:
- V prípade plánovanie zhora dole (top-down) riešenie postupne zjemňujeme zhora dole (stepwise refinement), a teda malé úlohy riešime až v konečnej etape riešenia.
- Podstatou plánovania zdola nahor (bottom-up) je, že riešenie zostavujeme už z hotových riešených dielčích úloh. Toto pripadá do úvahy, keď dielčie úlohy sme vyriešili v procese riešenia inej úlohy, alebo ak sme si kúpili knižnicu podprogramov. Vybrať z hotových podprogramov a ich pospájať dokáže iba skúsený programátor s dlhoročnou praxou.
Väčšina metodík tvorby programov navrhuje vhodnú kombináciu týchto dvoch metód.
|